package read;

import entity.Product;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import untils.ExcelUtil;

import java.io.FileInputStream;
import java.util.List;

/**
 * @author ghp
 * @date 2023/1/24
 * @title
 * @description
 */
public class ReadExcel07 {
    public static void main(String[] args) {
        try {
//            new ReadExcel07().readExcel07();
//            new ReadExcel07().getEntities();
            new ReadExcel07().getFormula();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 读取07版本的Excel
     */
    public void readExcel07() throws Exception {
        // 通过文件流读取工作簿
        FileInputStream fis = new FileInputStream("D:/Test/test-07.xlsx");
        // 获取工作簿对象
        Workbook workbook = new XSSFWorkbook(fis);
        // 获取表，可以通过下标的方式读取，也可以通过表名读取
//        Sheet sheet = workbook.getSheetAt(0);
        Sheet sheet = workbook.getSheet("07版本测试");
        // 获取行，采用索引号获取
        Row row = sheet.getRow(0);
        // 获取单元格
        Cell cell = row.getCell(0);
        // 读取数据
        String data = cell.getStringCellValue();
        // 关流
        fis.close();

        System.out.println("data = " + data);
    }

    /**
     * 批量读取07版本的Excel（将读取的数据转换成实体类）
     */
    public void getEntities() throws Exception {
        FileInputStream fis = new FileInputStream("D:/Test/test-07.xlsx");
        Workbook workbook = new XSSFWorkbook(fis);
        List<Product> list = ExcelUtil.readExcel(workbook, Product.class);
        list.forEach(System.out::println);
        fis.close();
    }

    /**
     * 07版本的Excel获取公式
     */
    public void getFormula() throws Exception {
        // 通过文件流读取工作簿
        FileInputStream fis = new FileInputStream("D:/Test/test-07.xlsx");
        // 获取工作簿对象
        Workbook workbook = new XSSFWorkbook(fis);
        // 获取表，可以通过下标的方式读取，也可以通过表名读取
        Sheet sheet = workbook.getSheetAt(1);
//        Sheet sheet = workbook.getSheet("07版本-公式");

        // 获取目标公式所在行的对象(第三行)
        Row row = sheet.getRow(2);
        // 获取目标公式所在的单元格对象
        Cell cell = row.getCell(0);

        // 这里就可以直接获取到公式所计算的值了
//        System.out.println("cell.getNumericCellValue() = " + cell.getNumericCellValue());

        // 获取计算公式
        FormulaEvaluator formulaEvaluator = new XSSFFormulaEvaluator((XSSFWorkbook) workbook);
        // 获取单元格的类型
        CellType cellType = cell.getCellType();
        switch (cellType){
            case FORMULA: // 公式
                // 获取公式
                String formula = cell.getCellFormula();
                System.out.println("formula = " + formula);
                // 获取计算结果
                CellValue value = formulaEvaluator.evaluate(cell);
                String val = value.formatAsString();
                System.out.println("value = " + val);
                break;
            default:
                System.out.println("数据的非公式");
                break;
        }
        fis.close();
    }
}
